\ExplSyntaxOn

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Font definitions
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\RequirePackage{lettrine}
\RequirePackage{Royal}
\RequirePackage[auto]{contour}

\bool_if:NT \l__dnd_layout_bool
  {
    \RequirePackage{bookman}
    \RequirePackage[type1]{gillius2}
    \RequirePackage[notext,nomath,nott]{kpfonts}
    \RequirePackage[T1]{fontenc}
    \renewcommand{\sfdefault}{jkpss}
  }

\cs_new_protected:Npn \__dnd_sf_initial_family:
  {
    \bool_if:NTF \l__dnd_layout_bool
      { \gilliustwo }
      { \sffamily }
  }

\keys_define:nn { dnd / fonts }
  {
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Sectioning commands
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Part
    part-family .tl_set:N         = \l__dnd_part_family_tl,
    part-family .initial:n        = \normalfont,
    part-family .value_required:n = true,
    part-style .tl_set:N         = \l__dnd_part_style_tl,
    part-style .initial:n        = \color{titlered} \Huge \scshape,
    part-style .value_required:n = true,
    % Chapter
    chapter-family .tl_set:N         = \l__dnd_chapter_family_tl,
    chapter-family .initial:n        = \normalfont,
    chapter-family .value_required:n = true,
    chapter-style .tl_set:N         = \l__dnd_chapter_style_tl,
    chapter-style .initial:n        = \linespread{.9} \color{titlered} \Huge \scshape,
    chapter-style .value_required:n = true,
    % Section
    section-family .tl_set:N         = \l__dnd_section_family_tl,
    section-family .initial:n        = \normalfont,
    section-family .value_required:n = true,
    section-style .tl_set:N         = \l__dnd_section_style_tl,
    section-style .initial:n        = \linespread{.9} \color{titlered} \huge \scshape \RaggedRight,
    section-style .value_required:n = true,
    % Subsection
    subsection-family .tl_set:N         = \l__dnd_subsection_family_tl,
    subsection-family .initial:n        = \normalfont,
    subsection-family .value_required:n = true,
    subsection-style .tl_set:N         = \l__dnd_subsection_style_tl,
    subsection-style .initial:n        = \linespread{.9} \color{titlered} \Large \scshape \RaggedRight,
    subsection-style .value_required:n = true,
    % subsubsection
    subsubsection-family .tl_set:N         = \l__dnd_subsubsection_family_tl,
    subsubsection-family .initial:n        = \normalfont,
    subsubsection-family .value_required:n = true,
    subsubsection-style .tl_set:N         = \l__dnd_subsubsection_style_tl,
    subsubsection-style .initial:n        = \linespread{.9} \color{titlered} \large \scshape \RaggedRight,
    subsubsection-style .value_required:n = true,
    % paragraph
    paragraph-family .tl_set:N         = \l__dnd_paragraph_family_tl,
    paragraph-family .value_required:n = true,
    paragraph-style .tl_set:N         = \l__dnd_paragraph_style_tl,
    paragraph-style .initial:n        = \bfseries \slshape,
    paragraph-style .value_required:n = true,
    % subparagraph
    subparagraph-family .tl_set:N         = \l__dnd_subparagraph_family_tl,
    subparagraph-family .value_required:n = true,
    subparagraph-style .tl_set:N         = \l__dnd_subparagraph_style_tl,
    subparagraph-style .initial:n        = \bfseries \slshape,
    subparagraph-style .value_required:n = true,
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Tables
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Table title
    table-title-family .tl_set:N         = \l__dnd_table_title_family_tl,
    table-title-family .initial:n        = \sffamily,
    table-title-family .value_required:n = true,
    table-title-style .tl_set:N         = \l__dnd_table_title_style_tl,
    table-title-style .initial:n        = \bfseries \scshape \large,
    table-title-style .value_required:n = true,
    % Table header
    table-header-family .tl_set:N         = \l__dnd_table_header_family_tl,
    table-header-family .initial:n        = \sffamily,
    table-header-family .value_required:n = true,
    table-header-style .tl_set:N         = \l__dnd_table_header_style_tl,
    table-header-style .initial:n        = \bfseries,
    table-header-style .value_required:n = true,
    % Table body
    table-body-family .tl_set:N         = \l__dnd_table_body_family_tl,
    table-body-family .initial:n        = \__dnd_sf_initial_family:,
    table-body-family .value_required:n = true,
    table-body-style .tl_set:N         = \l__dnd_table_body_style_tl,
    table-body-style .initial:n        = \small,
    table-body-style .value_required:n = true,
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Comment boxes
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Comment title
    comment-title-family .tl_set:N         = \l__dnd_comment_title_family_tl,
    comment-title-family .initial:n        = \sffamily,
    comment-title-family .value_required:n = true,
    comment-title-style .tl_set:N         = \l__dnd_comment_title_style_tl,
    comment-title-style .initial:n        = \bfseries \scshape,
    comment-title-style .value_required:n = true,
    % Comment body
    comment-body-family .tl_set:N         = \l__dnd_comment_body_family_tl,
    comment-body-family .initial:n        = \__dnd_sf_initial_family:,
    comment-body-family .value_required:n = true,
    comment-body-style .tl_set:N         = \l__dnd_comment_body_style_tl,
    comment-body-style .initial:n        = \small,
    comment-body-style .value_required:n = true,
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Sidebars
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Sidebar title
    sidebar-title-family .tl_set:N         = \l__dnd_sidebar_title_family_tl,
    sidebar-title-family .initial:n        = \sffamily,
    sidebar-title-family .value_required:n = true,
    sidebar-title-style .tl_set:N         = \l__dnd_sidebar_title_style_tl,
    sidebar-title-style .initial:n        = \bfseries \scshape,
    sidebar-title-style .value_required:n = true,
    % Sidebar body
    sidebar-body-family .tl_set:N         = \l__dnd_sidebar_body_family_tl,
    sidebar-body-family .initial:n        = \__dnd_sf_initial_family:,
    sidebar-body-family .value_required:n = true,
    sidebar-body-style .tl_set:N         = \l__dnd_sidebar_body_style_tl,
    sidebar-body-style .initial:n        = \small,
    sidebar-body-style .value_required:n = true,
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Read-aloud boxes
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    readaloud-family .tl_set:N         = \l__dnd_readaloud_family_tl,
    readaloud-family .initial:n        = \__dnd_sf_initial_family:,
    readaloud-family .value_required:n = true,
    readaloud-style .tl_set:N         = \l__dnd_readaloud_style_tl,
    readaloud-style .initial:n        = \small,
    readaloud-style .value_required:n = true,
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Table of Contents
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Part
    toc-part-family .tl_set:N         = \l__dnd_toc_part_family_tl,
    toc-part-family .initial:n        = \normalfont,
    toc-part-family .value_required:n = true,
    toc-part-style .tl_set:N         = \l__dnd_toc_part_style_tl,
    toc-part-style .initial:n        = \Large \scshape \color{titlered},
    toc-part-style .value_required:n = true,
    % Chapter
    toc-chapter-family .tl_set:N         = \l__dnd_toc_chapter_family_tl,
    toc-chapter-family .initial:n        = \normalfont,
    toc-chapter-family .value_required:n = true,
    toc-chapter-style .tl_set:N         = \l__dnd_toc_chapter_style_tl,
    toc-chapter-style .initial:n        = \large \scshape \color{titlered},
    toc-chapter-style .value_required:n = true,
    % Section
    toc-section-family .tl_set:N         = \l__dnd_toc_section_family_tl,
    toc-section-family .initial:n        = \normalfont,
    toc-section-family .value_required:n = true,
    toc-section-style .tl_set:N         = \l__dnd_toc_section_style_tl,
    toc-section-style .initial:n        = \normalsize,
    toc-section-style .value_required:n = true,
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Stat blocks
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Stat block title
    stat-block-title-family .tl_set:N         = \l__dnd_stat_block_title_family_tl,
    stat-block-title-family .initial:n        = \normalfont,
    stat-block-title-family .value_required:n = true,
    stat-block-title-style .tl_set:N         = \l__dnd_stat_block_title_style_tl,
    stat-block-title-style .initial:n        = \bfseries \scshape \LARGE,
    stat-block-title-style .value_required:n = true,
    % Stat block body
    stat-block-body-family .tl_set:N         = \l__dnd_stat_block_body_family_tl,
    stat-block-body-family .initial:n        = \__dnd_sf_initial_family:,
    stat-block-body-family .value_required:n = true,
    stat-block-body-style .tl_set:N         = \l__dnd_stat_block_body_style_tl,
    stat-block-body-style .initial:n        = \small,
    stat-block-body-style .value_required:n = true,
    % Stat block section
    stat-block-section-family .tl_set:N         = \l__dnd_stat_block_section_family_tl,
    stat-block-section-family .initial:n        = \sffamily,
    stat-block-section-family .value_required:n = true,
    stat-block-section-style .tl_set:N         = \l__dnd_stat_block_section_style_tl,
    stat-block-section-style .initial:n        = \color{titlered} \scshape \large,
    stat-block-section-style .value_required:n = true,
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Miscellaneous
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Footer
    footer-family .tl_set:N         = \l__dnd_footer_family_tl,
    footer-family .initial:n        = \normalfont,
    footer-family .value_required:n = true,
    footer-style .tl_set:N         = \l__dnd_footer_style_tl,
    footer-style .initial:n        = \scriptsize \textcolor{pagegold},
    footer-style .value_required:n = true,
    % Page number
    page-number-family .tl_set:N         = \l__dnd_page_number_family_tl,
    page-number-family .initial:n        = \normalfont,
    page-number-family .value_required:n = true,
    page-number-style .tl_set:N         = \l__dnd_page_number_style_tl,
    page-number-style .initial:n        = \scriptsize \textcolor{pagegold},
    page-number-style .value_required:n = true,
    % Drop caps
    drop-cap-family .tl_set:N         = \l__dnd_drop_cap_family_tl,
    drop-cap-family .initial:n        = \Royal,
    drop-cap-family .value_required:n = true,
    drop-cap-style .tl_set:N         = \l__dnd_drop_cap_style_tl,
    drop-cap-style .value_required:n = true,
  }

\NewDocumentCommand { \DndSetFonts } { o }
  {
    \keys_set:nn { dnd / fonts } { #1 }
  }

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Font access functions combine the selected family and style
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Sectioning commands
\NewDocumentCommand{\DndFontPart}{}
  { \l__dnd_part_family_tl \l__dnd_part_style_tl}

\NewDocumentCommand{\DndFontChapter}{}
  { \l__dnd_chapter_family_tl \l__dnd_chapter_style_tl }

\NewDocumentCommand{\DndFontSection}{}
  { \l__dnd_section_family_tl \l__dnd_section_style_tl }

\NewDocumentCommand{\DndFontSubsection}{}
  { \l__dnd_subsection_family_tl \l__dnd_subsection_style_tl }

\NewDocumentCommand{\DndFontSubsubsection}{}
  { \l__dnd_subsubsection_family_tl \l__dnd_subsubsection_style_tl }

\NewDocumentCommand{\DndFontParagraph}{}
  { \l__dnd_paragraph_family_tl \l__dnd_paragraph_style_tl }

\NewDocumentCommand{\DndFontSubaragraph}{}
  { \l__dnd_subparagraph_family_tl \l__dnd_subparagraph_style_tl }

% Tables
\NewDocumentCommand{\DndFontTableTitle}{}
  { \l__dnd_table_title_family_tl \l__dnd_table_title_style_tl }

\NewDocumentCommand{\DndFontTableHeader}{}
  { \l__dnd_table_header_family_tl \l__dnd_table_header_style_tl }

\NewDocumentCommand{\DndFontTableBody}{}
  { \l__dnd_table_body_family_tl \l__dnd_table_body_style_tl }

% Comment boxes
\NewDocumentCommand{\DndFontCommentTitle}{}
  { \l__dnd_comment_title_family_tl \l__dnd_comment_title_style_tl }

\NewDocumentCommand{\DndFontCommentBody}{}
  { \l__dnd_comment_body_family_tl \l__dnd_comment_body_style_tl }

% Sidebars
\NewDocumentCommand{\DndFontSidebarTitle}{}
  { \l__dnd_sidebar_title_family_tl \l__dnd_sidebar_title_style_tl }

\NewDocumentCommand{\DndFontSidebarBody}{}
  { \l__dnd_sidebar_body_family_tl \l__dnd_sidebar_body_style_tl }

% Read-aloud boxes
\NewDocumentCommand{\DndFontReadAloud}{}
  { \l__dnd_readaloud_family_tl \l__dnd_readaloud_style_tl }

% Table of Contents
\NewDocumentCommand{\DndFontTocPart}{}
  { \l__dnd_toc_part_family_tl \l__dnd_toc_part_style_tl}

\NewDocumentCommand{\DndFontTocChapter}{}
  { \l__dnd_toc_chapter_family_tl \l__dnd_toc_chapter_style_tl}

\NewDocumentCommand{\DndFontTocSection}{}
  { \l__dnd_toc_section_family_tl \l__dnd_toc_section_style_tl}

% Stat blocks
\NewDocumentCommand{\DndFontStatBlockTitle}{}
  { \l__dnd_stat_block_title_family_tl \l__dnd_stat_block_title_style_tl }

\NewDocumentCommand{\DndFontStatBlockBody}{}
  { \l__dnd_stat_block_body_family_tl \l__dnd_stat_block_body_style_tl }

\NewDocumentCommand{\DndFontStatBlockSection}{}
  { \l__dnd_stat_block_section_family_tl \l__dnd_stat_block_section_style_tl }

% Miscellaneous
\NewDocumentCommand{\DndFontFooter}{}
  { \l__dnd_footer_family_tl \l__dnd_footer_style_tl }

\NewDocumentCommand{\DndFontPageNumber}{}
  { \l__dnd_page_number_family_tl \l__dnd_page_number_style_tl }

\NewDocumentCommand{\DndFontDropCap}{}
  { \l__dnd_drop_cap_family_tl \l__dnd_drop_cap_style_tl }

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Drop Caps
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\renewcommand{\LettrineFontHook}
  { \l__dnd_drop_cap_family_tl \l__dnd_drop_cap_style_tl }

% Usage: DndDropCapLine[<lettrine options>]{<first letter>}{<small caps line>}
%    It takes trial and error to get the 2nd argument to align with
%    the linebreak. Lettrine package will not play nicely with \FirstLine. See
%    the lettrine package for options.
\NewDocumentCommand{\DndDropCapLine}{ O{} m m }
  {
    \lettrine[
        lines   = 4,
        depth   = 0,
        findent = \l__dnd_space_dim,
        nindent = 0pt,
        #1
      ]
      {#2}
      {#3}
  }

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Contour that can break across lines. Can accept \newline to force a break.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\cs_new_protected:Npn \__dnd_contour_preserve_space:nn #1#2
  {
    \group_begin:
    \seq_set_split:Nnn \l_tmpa_seq { ~ } { #2 }
    \seq_set_map:NNn \l_tmpb_seq \l_tmpa_seq { \exp_not:n {\contour{#1}{##1}} }
    \seq_use:Nn \l_tmpb_seq { ~ }
    \group_end:
  }

\NewDocumentCommand{\DndContour}{ O{contourgray} m }
  {
    \group_begin:
    \seq_set_split:Nnn \l_tmpa_seq { \newline } { #2 }
    \seq_set_map:NNn \l_tmpb_seq \l_tmpa_seq { \exp_not:n {\__dnd_contour_preserve_space:nn{#1}{##1}} }
    \seq_use:Nn \l_tmpb_seq { \newline }
    \group_end:
  }
